package main

import (
	user_controller "first_iris_demo/controller/user"
	auth_middleware "first_iris_demo/middleware/auth"
	"first_iris_demo/model"

	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/sessions"
)

func main() {
	// 创建应用
	app := iris.New()
	// 启用压缩
	app.Use(iris.Compression)
	app.Get("/index", func(c iris.Context) {
		path := c.Path()
		app.Logger().Infof("path: %s", path)
		c.JSON(iris.Map{
			"code":    200,
			"message": "Hello World!",
			"data":    path,
		})
	})

	// app.Get("/userinfo", func(c iris.Context) {
	// 	// 获取查询字符串
	// 	username := c.URLParam("username")
	// 	password := c.URLParam("password")
	// 	app.Logger().Infof("username: %s, password: %s", username, password)
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "Hello World!",
	// 		"data": iris.Map{
	// 			"username": username,
	// 			"password": password,
	// 		},
	// 	})
	// })

	// Post请求（获取form）
	// app.Post("/user/login", func(c iris.Context) {
	// 	// 获取请求体
	// 	// 注意PostValue只能获取form的数据
	// 	username := c.PostValue("username")
	// 	password := c.PostValue("password")
	// 	app.Logger().Infof("username: %s, password: %s", username, password)
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "登录成功！",
	// 		"data": iris.Map{
	// 			"username": username,
	// 			"password": password,
	// 			"token":    "abc123",
	// 		},
	// 	})
	// })

	// Post请求（获取Json）
	// app.Post("/user/getJson", func(c iris.Context) {
	// 	var user model.User
	// 	if err := c.ReadJSON(&user); err != nil {
	// 		c.StatusCode(iris.StatusBadRequest)
	// 		c.JSON(iris.Map{
	// 			"code":    400,
	// 			"message": "参数错误",
	// 			"data":    nil,
	// 		})
	// 		return
	// 	}
	// 	app.Logger().Infof("user: %+v", user)
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "登录成功！",
	// 		"data": iris.Map{
	// 			"username": user.Username,
	// 			"password": user.Password,
	// 			"token":    "abc123",
	// 		},
	// 	})
	// })

	// Handle
	// app.Handle("GET", "/user/info", func(c iris.Context) {
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "请求成功！",
	// 		"data": iris.Map{
	// 			"username": "admin",
	// 			"password": "123456",
	// 		},
	// 	})
	// })

	// app.Handle("POST", "/user/register", func(c iris.Context) {
	// 	var user model.User
	// 	if err := c.ReadJSON(&user); err != nil {
	// 		c.StatusCode(iris.StatusBadRequest)
	// 		c.JSON(iris.Map{
	// 			"code":    400,
	// 			"message": "参数错误！",
	// 			"data":    nil,
	// 		})
	// 		return
	// 	}
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "用户添加成功！",
	// 		"data":    nil,
	// 	})
	// })

	// 路径变量
	// app.Get("/weather/{date}/{city}", func(c iris.Context) {
	// 	date := c.Params().Get("date")
	// 	city := c.Params().Get("city")
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "请求成功！",
	// 		"data": iris.Map{
	// 			"date": date,
	// 			"city": city,
	// 		},
	// 	})
	// })

	// 限制路径变量的类型
	// app.Get("/api/user/{userId:uint64}", func(c iris.Context) {
	// 	userId := c.Params().GetUint64Default("userId", 0)
	// 	c.JSON(iris.Map{
	// 		"code":    200,
	// 		"message": "请求成功！",
	// 		"data": iris.Map{
	// 			"userId": userId,
	// 		},
	// 	})
	// })

	sessionId := "mySession"
	// session的创建
	sess := sessions.New(sessions.Config{
		Cookie: sessionId,
	})

	app.Post("/api/user/login", func(c iris.Context) {
		var user model.User
		if err := c.ReadJSON(&user); err != nil {
			c.StatusCode(iris.StatusBadRequest)
			c.JSON(iris.Map{
				"code":    400,
				"message": "参数错误",
				"data":    nil,
			})
			return
		}
		session := sess.Start(c)
		if user.Username == "admin" && user.Password == "123456" {
			// 创建session
			session.Set("username", user.Username)
			session.Set("password", user.Password)
			session.Set("isLogin", true)
			c.JSON(iris.Map{
				"code":    200,
				"message": "登录成功！",
				"data": iris.Map{
					"username": user.Username,
					"password": user.Password,
					"token":    "abc123",
				},
			})
		} else {
			session.Set("isLogin", false)
			c.JSON(iris.Map{
				"code":    401,
				"message": "用户名或密码错误！",
				"data":    nil,
			})
		}
	})

	userApi := app.Party("/api/user")
	{
		userApi.Use(iris.Compression)
		userApi.Use(auth_middleware.AuthMiddleware)
		userApi.Post("/register", user_controller.UserRegister)
		userApi.Post("/getUserById", user_controller.GetUserById)
	}

	// 这里用app.Run或者app.Listen似乎都是可以启动项目的
	// 但是要注意它们接收的地址参数类型不一样
	// app.Run(iris.Addr(":9000"), iris.WithoutServerError(iris.ErrServerClosed))
	app.Listen(":9000")
}
